package com.cskaoyan._06this._02basic;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/4 10:08
 **/
/*
Java类中的每个成员方法的形参列表中都隐含了一个传参（隐式传参），
传入的是当前对象，用this关键字指向！

说明:
    1.this是一个引用,指向当前对象
    2.什么是当前对象?
        对象.方法名(实参列表)进行成员方法调用的时候
        当前对象就是这个调用方法的对象

验证当前对象:
    同过打印2次地址值进行验证
    com.cskaoyan._06this._02basic.Student@1b6d3586
    com.cskaoyan._06this._02basic.Student@1b6d3586


既然this已经指向当前对象，是一个引用，那么它基本的用途就有：

1. 在成员方法中，用this引用去访问类中成员变量和调用类中成员方法。
  - 由于this本身就是隐含的，所以一般情况下，可以省略this，直接访问类中成员。
2. 特殊情况下，当成员方法中的局部变量和成员变量同名时，
可以用 "this."访问 来表示访问同名成员变量，来和同名局部变量做区分。这种情况，this是不能省略的。
3. 在成员方法中只要使用 "this."访问 一个变量，那么该变量一定是成员变量。
在代码比较复杂的情况下，可以显著增加代码可读性。
4.get和set方法也会使用到this


注意事项
1. this指向当前对象的隐含传参，必须是在普通成员方法中，
加static的方法中，没有该this传参。
（所以static方法不能直接访问类的成员，需要先创建对象才能访问。）
2. 既然this指向当前对象，那么不同的this指向的对象必然不同。
 */
public class Demo {
    public static void main(String[] args) {
        Student student = new Student();
        System.out.println(student);

        // 调用sleep方法
        student.sleep();
    }
}

class Student{
    String name = "zs";
    public void sleep() {
        System.out.println(this);
        // 不使用this可以访问成员变量
        System.out.println(name);
        // 不使用this也可以直接调用其他成员方法
        study();

        // 可以使用this进行访问
        System.out.println(this.name);
        this.study();
    }

    public void study() {
        System.out.println("study");
    }

    // static方法
    public static void test() {
        // 静态方法中访问成员变量
        // Non-static field 'name' cannot be referenced from a static context
        // System.out.println(name);
        // 静态方法中调用成员方法
        // study();

        // 即在静态方法中不能访问类成员(非静态的), 没有对象
        //System.out.println(this);
    }


    //// get方法 ,一般是getXxx 小驼峰原则 ----> 获取成员变量的值
    //public String getName(){
    //    return this.name;
    //}
    //
    //// set方法, 一般是setXxx 小驼峰---->给成员变量赋值
    //public void setName(String name) {
    //    this.name = name;
    //}

    // 使用快捷键 alt+insert

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}